package rothag.views;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JFrame;
import rothag.models.JoueurInterface;
import rothag.controller.MainController;
import rothag.enums.EtapeJeu;
import rothag.graphics.*;
import rothag.views.gamestep.PartieJPanel;
import rothag.views.gamestep.InfosJoueurJPanel;
import rothag.views.homemenu.HomeMenuJPanel;
import rothag.listener.PartieListener;
import rothag.views.help.HelpJPanel;

/**
 *
 * @author Gaetan, Gulian
 * @version 0.2
 *
 */
public class ImageJPanel extends JPanelBase implements PartieListener {

    public static final int MODE_MENU = 0;
    public static final int MODE_CREER = 1;
    public static final int MODE_PARTIE = 2;
    public static final int MODE_CHARGER = 3;
    public static final int MODE_TOP_SCORE = 4;
    private Image image;
    private InfosJoueurJPanel infoJoueur;
    private PartieJPanel partie;
    private HomeMenuJPanel homeMenu;
    private JFrame helpFrame;
    private int mode;
    private ArrayList<JoueurInterface> listeJoueur;

    /** Creates new form ImageJPanel */
    public ImageJPanel(MainController controller) {
        super(controller);

        controller.addPartieListener(this);

        // Définition de la taille
        hauteur = GraphicsParameters.mainHeight;
        largeur = GraphicsParameters.mainWidth;

        try {
            image = GraphicsHelper.getImage(GraphicsParameters.pathFond, this);
            setOpaque(false);

            // Partie de gauche infos
            infoJoueur = new InfosJoueurJPanel(controller);
            GraphicsHelper.setBounds(0, 25, infoJoueur);
            add(infoJoueur);

            // Partie de droite
            partie = new PartieJPanel(controller, this);
            GraphicsHelper.setBounds(infoJoueur.largeur, 0, partie);
            add(partie);

            // Menu principal
            homeMenu = new HomeMenuJPanel(controller);
            GraphicsHelper.setBounds(0, 0, homeMenu);
            add(homeMenu);
        } catch (IOException ex) {
            GraphicsHelper.afficherErreur("Erreur", "Erreur lors de l'ouverture du fichier image : " + GraphicsParameters.pathFond, this).setVisible(true);
            System.exit(1);
        }

        setMode(MODE_MENU);

        HelpJPanel helpPanel = new HelpJPanel(null);
        helpFrame = new JFrame();
        helpFrame.getContentPane().setLayout(new BorderLayout());
        helpFrame.getContentPane().add(helpPanel, BorderLayout.CENTER);
        helpFrame.setSize(helpPanel.getLargeur(), helpPanel.getHauteur());
        helpFrame.setResizable(false);
        helpFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        helpFrame.setLocation((screen.width - helpFrame.getSize().width) / 2, (screen.height - helpFrame.getSize().height) / 2);
    }

    @Override
    public void paint(Graphics g) {
        if (image != null) {
            g.drawImage(image, 0, 0, largeur, hauteur, this);
        }
        super.paint(g);
    }

    public void setMode(int mode) {
        this.mode = mode;

        boolean home = mode != MODE_PARTIE;

//        helpPanel.setVisible(false);
        homeMenu.setVisible(home);
        partie.setVisible(!home);
        infoJoueur.setVisible(!home);

        switch (mode) {
            case MODE_MENU:
                homeMenu.menuPrincipal();
                break;
            case MODE_CREER:
                homeMenu.nouvellePartie();
                break;
            case MODE_CHARGER:
                homeMenu.chargerPartie();
                break;
            case MODE_PARTIE:
                break;
            case MODE_TOP_SCORE:
                homeMenu.topScore();
                break;
        }
    }

    public int getMode() {
        return mode;
    }

    public InfosJoueurJPanel getInfoJoueur() {
        return infoJoueur;
    }

    public PartieJPanel getPartie() {
        return partie;
    }

    public HomeMenuJPanel getHomeMenu() {
        return homeMenu;
    }

    public void partieStarted() {
        setMode(MODE_PARTIE);
    }

    public void etapeCouranteChanged(EtapeJeu etapeJeu) {
        partie.setEtapeJeu(etapeJeu);
        infoJoueur.getEtapeJeuJPanel().setEtapeJeu(etapeJeu);
    }

    public void tourChanged(int tour) {
        partie.getInfosTour().setTour(tour);
    }

    public void listeJoueurChanged(ArrayList<JoueurInterface> listeJoueur) {
        this.listeJoueur = listeJoueur;
        if (listeJoueur != null) {
            String[] listeNom = new String[listeJoueur.size()];
            for (int i = 0; i < listeJoueur.size(); i++) {
                listeNom[i] = listeJoueur.get(i).getNom();
            }
            partie.getInfosTour().setJoueurList(listeNom);
        }
    }

    public void joueurCourantChanged(JoueurInterface joueurCourant) {
        int index = listeJoueur.indexOf(joueurCourant);
        partie.getInfosTour().setJoueur(index);
    }

    public void afficherHelp() {
        helpFrame.setVisible(true);
    }
}
